// 商品购物车持久化

import { getCartList, updateCartCount, delCart } from '@/api/cart'
import { Toast } from 'vant'
export default {
  namespaced: true,
  state: {
    // 购物车列表
    cartList: []
  },
  mutations: {
    // 添加商品到购物车
    setCartList (state, newList) {
      // 判断购物车是否已经有该商品
      state.cartList = newList
    },
    // 点击切换复选框选中状态
    toggleCheck (state, goodsId) {
      // find返回第一个满足条件的元素
      const goods = state.cartList.find(item => item.goods_id === goodsId)
      goods.isChecked = !goods.isChecked
    },
    // 点击全选 => 控制全选
    toggleAllCheck (state, flag) {
      state.cartList.forEach(item => {
        item.isChecked = flag
      })
    },
    // 更新购物车商品数量
    changeCount (state, { goodsId, goodsNum }) {
      const goods = state.cartList.find(item => item.goods_id === goodsId)
      goods.goods_num = goodsNum
    }
  },
  actions: {
    // 添加商品到购物车
    async getCartAction (context, goods) {
      const { data } = await getCartList()
      // 后台返回的数据中 不包含复选框的选中状态，为了实现将来的功能
      // 需要手动维护数据，给每一项添加一个  isChecked 选中状态 (标记是否选中)
      data.list.forEach(item => {
        item.isChecked = true
      })
      context.commit('setCartList', data.list)
    },
    // 更新购物车商品数量
    async changeCount (context, { goodsId, goodsNum, goodsSkuId }) {
      // 先本地修改
      context.commit('changeCount', { goodsId, goodsNum })
      // 再后台修改
      await updateCartCount(goodsId, goodsNum, goodsSkuId)
    },
    // 删除购物车商品
    async delCart (context, cartIds) {
      const selCartList = context.getters.selCartList
      const selIds = selCartList.map(item => item.id)
      await delCart(selIds)
      Toast('删除成功')
      // 删除后 重新渲染
      context.dispatch('getCartAction')
    }
  },
  getters: {
    // 购物车商品总数量
    cartTotal (state) {
      return state.cartList.reduce((sum, item) => sum + item.goods_num, 0)
    },
    // 选中的商品项
    selCartList (state) {
      return state.cartList.filter(item => item.isChecked)
    },
    // 选中的商品总价  getters第二个形参是getters
    selPrice (state, getters) {
      return getters.selCartList.reduce((sum, item) => sum + item.goods.goods_price_min * item.goods_num, 0).toFixed(2)
    },
    // 选中的商品总数量
    selCount (state, getters) {
      return getters.selCartList.reduce((sum, item) => sum + item.goods_num, 0)
    },
    // 点击小选 => 控制全选
    isAllChecked (state, getters) {
      return state.cartList.every(item => item.isChecked)
    }

  }
}
